home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
libs
/
unixlib.lha
/
unix
/
src
/
access.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-11-10
|
884b
|
42 lines
#include "amiga.h"
#include <utility/tagitem.h>
#include <sys/types.h>
#include <sys/stat.h>
int __access(const char *name, int mode)
{
struct FileInfoBlock *fib;
BPTR lock = 0;
int ret = -1;
__chkabort();
if ((fib = AllocDosObjectTags(DOS_FIB, TAG_END)) &&
(lock = Lock(name, ACCESS_READ)) &&
Examine(lock, fib)) {
struct stat sbuf;
int fmode;
BPTR parent = ParentDir(lock);
int isroot = !parent;
long handler = (long)((struct FileLock *)((long)lock << 2))->fl_Task;
if (parent)
UnLock(parent);
_fibstat(fib, isroot, &sbuf, handler);
fmode = (sbuf.st_mode & (S_IREAD | S_IEXEC)) >> 6 |
(sbuf.st_mode & (S_IWRITE >> 3)) >> 3;
if ((fmode & mode) == mode)
ret = 0;
else
errno = EACCES;
} else
errno = convert_oserr(IoErr());
if (lock)
UnLock(lock);
if (fib)
FreeDosObject(DOS_FIB, fib);
return ret;
}